--[[
    函数：lua3_lab_check_industry
    功能：1、检查行业分类下的数据，2、并建立“行业－颜色”的映射表
    参数：ARGV[1]:limit, 最小个数限制
    返回：返回数组：
            0:code,0表示成功，其它表示没搜索到结果中途退出
            1:ids，行业下数据不足的行业id，半角逗号分割，格式："[ 行业ID] ]", 形如："[ 1,2,3,4 ]"
--]]

-- ########################################################

-- 分类的前缀
local PREFIX_TYPE = "lab_type_"
-- 标签的前缀
local PREFIX_LABEL_INDUSTRY = "lab_label_industry_"
local PREFIX_LABEL_SCENE = "lab_label_scene_"
local PREFIX_LABEL_STYLE = "lab_label_style_"
local PREFIX_LABEL_COLOR = "lab_label_color_"
local PREFIX_LABEL_CUSTOM = "lab_label_custom_"
local PREFIX_PRODUCT = "lab_product_"
local PREFIX_LABEL_INDUSTRY_COLOR = "lab_label_ind_color_"

-- 排序的key
local KEY_SORT = "lab_sort"
-- ID-模版缓存的前缀
local PREFIX_DESIGN = "lab_d_"

-- key的连接符号
local PREFIX_S = "*"
-- 数组字符串的分割符号
local PREFIX_ARRAY_SPLIT = ","
-- 左括号
local PREFIX_LEFT_EM = "["
-- 右括号
local PREFIX_RIGHT_EM = "]"

-- product的hash表的几个filed名称
local PRODUCT_HASH_KEY_FILED_LOGO_IMG = "logo_img"
local PRODUCT_HASH_KEY_FILED_SWITCH_LIST = "switch_list"
local PRODUCT_HASH_KEY_FILED_SEL_CONTENT_ID = "sel_content_id"


-- ########################################################
-- [局部函数] 组成返回值数组，第0个是错误码，第1个是ids
local retData = function(code,ids)
    local ret = {}
    table.insert(ret, code)

    table.insert(ret, ids)

    return ret
end


-- ########################################################
local limit = tonumber(ARGV[1]) or 0

-- 临时变量
local A='A'
local B='B'
local C='C'

-- 找出行业列表，备用
local ret = ''
local len_prefix_industry = #PREFIX_LABEL_INDUSTRY
local key = PREFIX_LABEL_INDUSTRY..PREFIX_S
local l_keys = redis.call('keys',key)
local l_len = #l_keys
if(l_len<1)
then
    -- 内部数据错误：types数据错误
    return retData(1,nil)
end


-- 找出颜色列表，备用
local len_prefix_color = #PREFIX_LABEL_COLOR
local key = PREFIX_LABEL_COLOR..PREFIX_S
local c_keys = redis.call('keys',key)
local c_len = #c_keys
if(c_len<1)
then
    -- 内部数据错误：颜色为空
    return retData(1,nil)
end


-- 遍历所有行业，找出数据不足的行业
ret = ret..PREFIX_LEFT_EM
for i= 1, l_len do
    local key1 = l_keys[i]
    local A_len = redis.call('SCARD',key1)
    if(A_len<limit)
    then
        -- 行业下数据不足的情况
        if(#ret>0)
        then
            ret =ret..PREFIX_ARRAY_SPLIT
        end
        ret = ret..string.sub(key1,len_prefix_industry+1)
    end
end
ret = ret..PREFIX_RIGHT_EM


--[[
-- 清除“行业－颜色”映射表
local key = PREFIX_LABEL_INDUSTRY_COLOR..PREFIX_S
local ic_keys = redis.call('keys',key)
local ic_len = #ic_keys
for i= 1, ic_len do
    local key1 = ic_keys[i]
    redis.call('del',key1)
end
--]]


local key_type_4 = PREFIX_TYPE..'4'
local key_type_1010 = PREFIX_TYPE..'1010'

-- 遍历所有行业和颜色，找出颜色数据不足的行业
for i= 1, l_len do
    local key1 = l_keys[i]
    local id_industry = string.sub(key1,len_prefix_industry+1)
    local A_len = redis.call('SCARD',key1)
    if(A_len>=limit)
    then
        -- 行业下数据充足的情况，
        for j= 1, c_len do
            local key2 = c_keys[j]
            local id_color = string.sub(key2,len_prefix_color+1)
            local M_len = redis.call('SCARD',key2)
            if(M_len>=limit)
            then
                -- 颜色下数据充足的情况
                -- 求行业、颜色交集，
                redis.call('del',A)
                redis.call('SINTERSTORE',A, key1, key2)
                local I_len = redis.call('SCARD',A)
                if(I_len>=limit)
                then
                    -- 如果足够，则需要与Logo和名片的分类求交集，必需个数都满足
                    redis.call('del',B)
                    redis.call('SINTERSTORE',B, A, key_type_4)
                    local I_len = redis.call('SCARD',B)
                    if(I_len>=limit)
                    then
                        redis.call('del',C)
                        redis.call('SINTERSTORE',C, A, key_type_1010)
                        local I_len = redis.call('SCARD',C)
                        if(I_len>=limit)
                        then
                            -- 个数满足就记录之
                            local new_key = PREFIX_LABEL_INDUSTRY_COLOR..id_industry
                            redis.call('SADD',new_key, id_color)
                        end
                    end
                end
            end
        end
    end
end





return retData(0,ret)
-- ########################################################
